package net.interneteidee.entity;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlTransient;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class Categoria {

	@Id
	@GeneratedValue
	private long idCategoria;
	
	@NotEmpty (message = "Nome Categoria obbligatorio")
	private String nome;

	private String descrizione;

	private boolean abilitata;

	@OneToMany(mappedBy = "categoria")
	private List<Prodotto> prodotti = new LinkedList<Prodotto>();

	@ManyToOne
	@JoinColumn(name = "categoriapadre_fk")
	private Categoria categoriaPadre;

	@ManyToOne
	@JoinColumn(name = "famiglia_fk")
	@NotNull(message="Seleziona una famiglia")
	private Famiglia famiglia;

	public Categoria() {
		// TODO Auto-generated constructor stub
	}

	public Categoria(String nome, String descrizione,
			boolean abilitata) {
		super();
		this.nome = nome;
		this.descrizione = descrizione;
		this.abilitata = abilitata;
	}

	public long getIdCategoria() {
		return idCategoria;
	}

	public void setIdCategoria(long idCategoria) {
		this.idCategoria = idCategoria;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDescrizione() {
		return descrizione;
	}

	public void setDescrizione(String descrizione) {
		this.descrizione = descrizione;
	}

	public boolean isAbilitata() {
		return abilitata;
	}

	public void setAbilitata(boolean abilitata) {
		this.abilitata = abilitata;
	}

	public List<Prodotto> getProdotti() {
		return prodotti;
	}

	public void setProdotti(List<Prodotto> prodotti) {
		this.prodotti = prodotti;
	}

	public Categoria getCategoriaPadre() {
		return categoriaPadre;
	}

	public void setCategoriaPadre(Categoria categoriaPadre) {
		this.categoriaPadre = categoriaPadre;
	}

	public Famiglia getFamiglia() {
		return famiglia;
	}

	public void setFamiglia(Famiglia famiglia) {
		this.famiglia = famiglia;
	}

	/**
	 * Aggiunge un prodotto alla categoria corrente
	 * 
	 * @param prodotto
	 */
	public void addProdotto(Prodotto prodotto) {
		prodotti.add(prodotto);
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return nome;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (abilitata ? 1231 : 1237);
		result = prime * result
				+ ((categoriaPadre == null) ? 0 : categoriaPadre.hashCode());
		result = prime * result
				+ ((descrizione == null) ? 0 : descrizione.hashCode());
		result = prime * result
				+ ((famiglia == null) ? 0 : famiglia.hashCode());
		result = prime * result + (int) (idCategoria ^ (idCategoria >>> 32));
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Categoria other = (Categoria) obj;
		if (abilitata != other.abilitata)
			return false;
		if (categoriaPadre == null) {
			if (other.categoriaPadre != null)
				return false;
		} else if (!categoriaPadre.equals(other.categoriaPadre))
			return false;
		if (descrizione == null) {
			if (other.descrizione != null)
				return false;
		} else if (!descrizione.equals(other.descrizione))
			return false;
		if (famiglia == null) {
			if (other.famiglia != null)
				return false;
		} else if (!famiglia.equals(other.famiglia))
			return false;
		if (idCategoria != other.idCategoria)
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
	}

	
	
	
	

	
}
